1 . Setting up

if (!require(pacman))
  install.packages("pacman")
pacman::p_load(tibble, readr, dplyr, tidyr, lubridate, stringr, ggplot2, PBSmapping, animation)
pacman::p_load_gh("sjmgarnier/graphZoo")

2 . Loading and preparing data

if (!file.exists("data.csv")) {
  tmp <- read_delim("http://app.ntsb.gov/aviationquery/Download.ashx?type=csv", 
                    "|", na = c("NA", "", "N/A"))
  write_csv(tmp[, 1:(ncol(tmp) - 1)], "data.csv")
}
  
raw_dat <- read_csv("data.csv") %>%
  mutate(`Event Date` = mdy(`Event Date`)) %>%
  filter(year(`Event Date`) >= 1982, year(`Event Date`) < 2018,
         `Investigation Type` == "Accident", Country == "United States") %>%
  mutate(`Total Fatal Injuries` = ifelse(is.na(`Total Fatal Injuries`), 0, `Total Fatal Injuries`),
         `Total Serious Injuries` = ifelse(is.na(`Total Serious Injuries`), 0, `Total Serious Injuries`),
         `Total Minor Injuries` = ifelse(is.na(`Total Minor Injuries`), 0, `Total Minor Injuries`))
Parsed with column specification:
cols(
  .default = col_character(),
  Latitude = col_double(),
  Longitude = col_double(),
  `Number of Engines` = col_integer(),
  `Total Fatal Injuries` = col_integer(),
  `Total Serious Injuries` = col_integer(),
  `Total Minor Injuries` = col_integer(),
  `Total Uninjured` = col_integer()
)
See spec(...) for full column specifications.
raw_dat

3 . Time

##. Preparing data

byday_dat <- raw_dat %>%
  group_by(`Event Date`) %>%
  summarize(Events = n(),
            `Total Fatal Injuries` = sum(`Total Fatal Injuries`, na.rm = TRUE),
            `Total Serious Injuries` = sum(`Total Serious Injuries`, na.rm = TRUE),
            `Total Minor Injuries` = sum(`Total Minor Injuries`, na.rm = TRUE)) %>%
  complete(`Event Date` = seq.Date(ymd("1982-01-01"), ymd("2017-12-31"), by = 1),
           fill = list(Events = 0,
                       `Total Fatal Injuries` = 0, 
                       `Total Serious Injuries` = 0,
                       `Total Minor Injuries` = 0)) %>%
  mutate(Year = year(`Event Date`),
         Month = month(`Event Date`, label = TRUE),
         Week = week(`Event Date`),
         Day = wday(`Event Date`, label = TRUE, week_start = 1))
byday_dat

3.1 . Number of accidents per month since 1982

g <- byday_dat %>%
  group_by(Month_end = ceiling_date(`Event Date`, unit = "months")) %>%
  summarize(Events = sum(Events)) %>%
  ggplot(aes(x = Month_end, y = Events)) +
  geom_line() +
  geom_line(stat = "smooth", method = loess, se = FALSE, size = 2, color = "#DB4A36", alpha = 0.75) +
  ylim(0, NA) +
  xlab(NULL) + ylab(NULL) + 
  theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM", 
                     r.txt = "DATA: NTSB",
                     font.size = 4)
gTitle <- gz_title("US civil aviation accidents, 1982-2017", size = 8)
gSubtitle <- gz_title("per month, within the USA, its territories and possessions, and in international waters", 
                      y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
           top = c(0.9, 1, 1, 0.05), 
           bottom = c(0.0125, 0, 0, 0))

3.2 . Number of fatalities per month since 1982

g <- byday_dat %>%
  group_by(Month_end = ceiling_date(`Event Date`, unit = "months")) %>%
  summarize(`Total Fatal Injuries` = sum(`Total Fatal Injuries`)) %>%
  ggplot(aes(x = Month_end, y = `Total Fatal Injuries`)) +
  geom_line() +
  geom_line(stat = "smooth", method = loess, se = FALSE, size = 2, color = "#DB4A36", alpha = 0.75) +
  ylim(0, NA) +
  xlab(NULL) + ylab(NULL) + 
  theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM", 
                     r.txt = "DATA: NTSB",
                     font.size = 4)
gTitle <- gz_title("US civil aviation fatalities, 1982-2017", size = 8)
gSubtitle <- gz_title("per month, within the USA, its territories and possessions, and in international waters", 
                      y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
           top = c(0.9, 1, 1, 0.05), 
           bottom = c(0.0125, 0, 0, 0))

3.3 . Number of injuries per month since 1982

g <- byday_dat %>%
  group_by(Month_end = ceiling_date(`Event Date`, unit = "months")) %>%
  summarize(Injuries = sum(`Total Serious Injuries`) + sum(`Total Minor Injuries`)) %>%
  ggplot(aes(x = Month_end, y = Injuries)) +
  geom_line() +
  geom_line(stat = "smooth", method = loess, se = FALSE, size = 2, color = "#DB4A36", alpha = 0.75) +
  ylim(0, NA) +
  xlab(NULL) + ylab(NULL) + 
  theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM", 
                     r.txt = "DATA: NTSB",
                     font.size = 4)
gTitle <- gz_title("US civil aviation non-lethal injuries, 1982-2017", size = 8)
gSubtitle <- gz_title("per month, within the USA, its territories and possessions, and in international waters", 
                      y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
           top = c(0.9, 1, 1, 0.05), 
           bottom = c(0.0125, 0, 0, 0))

3.4 . Month with most accidents

g <- byday_dat %>%
  group_by(Month) %>%
  summarize(total = sum(Events)) %>%
  ggplot(aes(x = Month, y = total, group = 1)) +
  geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
  ylim(0, NA) +
  xlab(NULL) + ylab(NULL) + 
  theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM", 
                     r.txt = "DATA: NTSB",
                     font.size = 4)
gTitle <- gz_title("US civil aviation accidents, 1982-2017", size = 8)
gSubtitle <- gz_title("total by month, within the USA, its territories and possessions, and in international waters", 
                      y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
           top = c(0.9, 1, 1, 0.05), 
           bottom = c(0.0125, 0, 0, 0))

3.5 . Days with most accidents

g <- byday_dat %>%
  group_by(Day) %>%
  summarize(total = sum(Events)) %>%
  ggplot(aes(x = Day, y = total, group = 1)) +
  geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
  ylim(0, NA) +
  xlab(NULL) + ylab(NULL) + 
  theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM", 
                     r.txt = "DATA: NTSB",
                     font.size = 4)
gTitle <- gz_title("US civil aviation accidents, 1982-2017", size = 8)
gSubtitle <- gz_title("total by day, within the USA, its territories and possessions, and in international waters", 
                      y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
           top = c(0.9, 1, 1, 0.05), 
           bottom = c(0.0125, 0, 0, 0))

3.6 . Month with most fatalities

g <- byday_dat %>%
  group_by(Month) %>%
  summarize(total = sum(`Total Fatal Injuries`)) %>%
  ggplot(aes(x = Month, y = total, group = 1)) +
  geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
  ylim(0, NA) +
  xlab(NULL) + ylab(NULL) + 
  theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM", 
                     r.txt = "DATA: NTSB",
                     font.size = 4)
gTitle <- gz_title("US civil aviation fatalities, 1982-2017", size = 8)
gSubtitle <- gz_title("total by month, within the USA, its territories and possessions, and in international waters", 
                      y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
           top = c(0.9, 1, 1, 0.05), 
           bottom = c(0.0125, 0, 0, 0))

3.7 . Days with most fatalities

g <- byday_dat %>%
  group_by(Day) %>%
  summarize(total = sum(`Total Fatal Injuries`)) %>%
  ggplot(aes(x = Day, y = total, group = 1)) +
  geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
  ylim(0, NA) +
  xlab(NULL) + ylab(NULL) + 
  theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM", 
                     r.txt = "DATA: NTSB",
                     font.size = 4)
gTitle <- gz_title("US civil aviation fatalities, 1982-2017", size = 8)
gSubtitle <- gz_title("total by day, within the USA, its territories and possessions, and in international waters", 
                      y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
           top = c(0.9, 1, 1, 0.05), 
           bottom = c(0.0125, 0, 0, 0))

3.8 . Month with most injuries

g <- byday_dat %>%
  group_by(Month) %>%
  summarize(total = sum(`Total Serious Injuries`) + sum(`Total Minor Injuries`)) %>%
  ggplot(aes(x = Month, y = total, group = 1)) +
  geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
  ylim(0, NA) +
  xlab(NULL) + ylab(NULL) + 
  theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM", 
                     r.txt = "DATA: NTSB",
                     font.size = 4)
gTitle <- gz_title("US civil aviation non-lethal injuries, 1982-2017", size = 8)
gSubtitle <- gz_title("total by month, within the USA, its territories and possessions, and in international waters", 
                      y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
           top = c(0.9, 1, 1, 0.05), 
           bottom = c(0.0125, 0, 0, 0))

3.9 . Days with most injuries

g <- byday_dat %>%
  group_by(Day) %>%
  summarize(total = sum(`Total Serious Injuries`) + sum(`Total Minor Injuries`)) %>%
  ggplot(aes(x = Day, y = total, group = 1)) +
  geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
  ylim(0, NA) +
  xlab(NULL) + ylab(NULL) + 
  theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM", 
                     r.txt = "DATA: NTSB",
                     font.size = 4)
gTitle <- gz_title("US civil aviation non-lethal injuries, 1982-2017", size = 8)
gSubtitle <- gz_title("total by day, within the USA, its territories and possessions, and in international waters", 
                      y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
           top = c(0.9, 1, 1, 0.05), 
           bottom = c(0.0125, 0, 0, 0))

4 . Space

4.1 . Preparing data

loc_dat <- raw_dat %>%
  filter(year(`Event Date`) >= 2002, year(`Event Date`) < 2018,
         !is.na(Latitude), !is.na(Longitude)) %>%
  mutate(Date_round = ceiling_date(`Event Date`, unit = "3 days"),
         Longitude = ifelse(Longitude > 0, -Longitude, Longitude))
loc_dat
xlim <- c(-180, -20)
ylim <- c(10, 72)
world_dat <- map_data("world") %>%
  rename(X = long, Y = lat, PID = group, POS = order) %>%
  clipPolys(xlim = xlim, ylim = ylim, keepExtra = TRUE) %>%
  as_tibble()
world_dat

4.2 . Animated map

if (!file.exists("animation.mp4")) {
  gBackground <- gz_background()
  gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM", 
                       r.txt = "DATA: NTSB",
                       font.size = 4)
  gTitle <- gz_title("Locations of US civil aviation accidents, 2002-2017", size = 8)
  gSubtitle <- gz_title("within the USA, its territories and possessions, and in international waters", 
                        y = 0.9125, size = 5, fontface = "italic")
  
  saveVideo({
    dates <- seq.Date(ymd("2002-01-01"), ymd("2017-12-31"), by = 3)
    for (i in seq(1:length(dates))) {
      g <- ggplot() +
        geom_polygon(data = world_dat, aes(x = X, y = Y, group = PID),
                     fill = "gray50", color = "white") +
        geom_point(data = filter(loc_dat, Date_round <= dates[i], Date_round >= (dates[i] - 60)), 
                   aes(x = Longitude, y = Latitude, alpha = 60 - as.numeric(dates[i] - Date_round)), 
                   pch = 21, fill = "#DB4A36", color = "black", size = 3) +
        annotate("text", x = -180, y = 11, hjust = 0, vjust = 0,
                 label = format(dates[i], format = "%b %Y")) +
        coord_map(xlim = xlim, ylim = ylim) +
        xlab(NULL) + ylab(NULL) + guides(alpha = FALSE) + 
        theme_graphzoo(base_size = 18) +
        theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(),
              panel.grid.major = element_blank(), panel.grid.minor = element_blank())
      
      gz_combine(gBackground, g, gTitle, gSubtitle, gBanner,
                 top = c(1, 0.9, 1, 1, 0.05),
                 bottom = c(0.05, 0.0125, 0.05, 0.05, 0))
    }
  }, ani.height = 480, ani.width = 720, interval = 1 / 30)
}

Animation

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHllcwotLS0KCiMgLiBTZXR0aW5nIHVwCgpgYGB7cn0KaWYgKCFyZXF1aXJlKHBhY21hbikpCiAgaW5zdGFsbC5wYWNrYWdlcygicGFjbWFuIikKCnBhY21hbjo6cF9sb2FkKHRpYmJsZSwgcmVhZHIsIGRwbHlyLCB0aWR5ciwgbHVicmlkYXRlLCBzdHJpbmdyLCBnZ3Bsb3QyLCBQQlNtYXBwaW5nLCBhbmltYXRpb24pCnBhY21hbjo6cF9sb2FkX2doKCJzam1nYXJuaWVyL2dyYXBoWm9vIikKYGBgCgojIC4gTG9hZGluZyBhbmQgcHJlcGFyaW5nIGRhdGEKCmBgYHtyfQppZiAoIWZpbGUuZXhpc3RzKCJkYXRhLmNzdiIpKSB7CiAgdG1wIDwtIHJlYWRfZGVsaW0oImh0dHA6Ly9hcHAubnRzYi5nb3YvYXZpYXRpb25xdWVyeS9Eb3dubG9hZC5hc2h4P3R5cGU9Y3N2IiwgCiAgICAgICAgICAgICAgICAgICAgInwiLCBuYSA9IGMoIk5BIiwgIiIsICJOL0EiKSkKICB3cml0ZV9jc3YodG1wWywgMToobmNvbCh0bXApIC0gMSldLCAiZGF0YS5jc3YiKQp9CiAgCnJhd19kYXQgPC0gcmVhZF9jc3YoImRhdGEuY3N2IikgJT4lCiAgbXV0YXRlKGBFdmVudCBEYXRlYCA9IG1keShgRXZlbnQgRGF0ZWApKSAlPiUKICBmaWx0ZXIoeWVhcihgRXZlbnQgRGF0ZWApID49IDE5ODIsIHllYXIoYEV2ZW50IERhdGVgKSA8IDIwMTgsCiAgICAgICAgIGBJbnZlc3RpZ2F0aW9uIFR5cGVgID09ICJBY2NpZGVudCIsIENvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiKSAlPiUKICBtdXRhdGUoYFRvdGFsIEZhdGFsIEluanVyaWVzYCA9IGlmZWxzZShpcy5uYShgVG90YWwgRmF0YWwgSW5qdXJpZXNgKSwgMCwgYFRvdGFsIEZhdGFsIEluanVyaWVzYCksCiAgICAgICAgIGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCA9IGlmZWxzZShpcy5uYShgVG90YWwgU2VyaW91cyBJbmp1cmllc2ApLCAwLCBgVG90YWwgU2VyaW91cyBJbmp1cmllc2ApLAogICAgICAgICBgVG90YWwgTWlub3IgSW5qdXJpZXNgID0gaWZlbHNlKGlzLm5hKGBUb3RhbCBNaW5vciBJbmp1cmllc2ApLCAwLCBgVG90YWwgTWlub3IgSW5qdXJpZXNgKSkKcmF3X2RhdApgYGAKCiMgLiBUaW1lIAoKIyMuIFByZXBhcmluZyBkYXRhCgpgYGB7cn0KYnlkYXlfZGF0IDwtIHJhd19kYXQgJT4lCiAgZ3JvdXBfYnkoYEV2ZW50IERhdGVgKSAlPiUKICBzdW1tYXJpemUoRXZlbnRzID0gbigpLAogICAgICAgICAgICBgVG90YWwgRmF0YWwgSW5qdXJpZXNgID0gc3VtKGBUb3RhbCBGYXRhbCBJbmp1cmllc2AsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCA9IHN1bShgVG90YWwgU2VyaW91cyBJbmp1cmllc2AsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBUb3RhbCBNaW5vciBJbmp1cmllc2AgPSBzdW0oYFRvdGFsIE1pbm9yIEluanVyaWVzYCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgY29tcGxldGUoYEV2ZW50IERhdGVgID0gc2VxLkRhdGUoeW1kKCIxOTgyLTAxLTAxIiksIHltZCgiMjAxNy0xMi0zMSIpLCBieSA9IDEpLAogICAgICAgICAgIGZpbGwgPSBsaXN0KEV2ZW50cyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgYFRvdGFsIEZhdGFsIEluanVyaWVzYCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgIGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgYFRvdGFsIE1pbm9yIEluanVyaWVzYCA9IDApKSAlPiUKICBtdXRhdGUoWWVhciA9IHllYXIoYEV2ZW50IERhdGVgKSwKICAgICAgICAgTW9udGggPSBtb250aChgRXZlbnQgRGF0ZWAsIGxhYmVsID0gVFJVRSksCiAgICAgICAgIFdlZWsgPSB3ZWVrKGBFdmVudCBEYXRlYCksCiAgICAgICAgIERheSA9IHdkYXkoYEV2ZW50IERhdGVgLCBsYWJlbCA9IFRSVUUsIHdlZWtfc3RhcnQgPSAxKSkKYnlkYXlfZGF0CmBgYAoKIyMgLiBOdW1iZXIgb2YgYWNjaWRlbnRzIHBlciBtb250aCBzaW5jZSAxOTgyCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NC41fQpnIDwtIGJ5ZGF5X2RhdCAlPiUKICBncm91cF9ieShNb250aF9lbmQgPSBjZWlsaW5nX2RhdGUoYEV2ZW50IERhdGVgLCB1bml0ID0gIm1vbnRocyIpKSAlPiUKICBzdW1tYXJpemUoRXZlbnRzID0gc3VtKEV2ZW50cykpICU+JQogIGdncGxvdChhZXMoeCA9IE1vbnRoX2VuZCwgeSA9IEV2ZW50cykpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9saW5lKHN0YXQgPSAic21vb3RoIiwgbWV0aG9kID0gbG9lc3MsIHNlID0gRkFMU0UsIHNpemUgPSAyLCBjb2xvciA9ICIjREI0QTM2IiwgYWxwaGEgPSAwLjc1KSArCiAgeWxpbSgwLCBOQSkgKwogIHhsYWIoTlVMTCkgKyB5bGFiKE5VTEwpICsgCiAgdGhlbWVfZ3JhcGh6b28oYmFzZV9zaXplID0gMjApCgpnQmFubmVyIDwtIGd6X2Jhbm5lcihsLnR4dCA9ICJHUkFQSFpPTy5UVU1CTFIuQ09NIiwgCiAgICAgICAgICAgICAgICAgICAgIHIudHh0ID0gIkRBVEE6IE5UU0IiLAogICAgICAgICAgICAgICAgICAgICBmb250LnNpemUgPSA0KQpnVGl0bGUgPC0gZ3pfdGl0bGUoIlVTIGNpdmlsIGF2aWF0aW9uIGFjY2lkZW50cywgMTk4Mi0yMDE3Iiwgc2l6ZSA9IDgpCmdTdWJ0aXRsZSA8LSBnel90aXRsZSgicGVyIG1vbnRoLCB3aXRoaW4gdGhlIFVTQSwgaXRzIHRlcnJpdG9yaWVzIGFuZCBwb3NzZXNzaW9ucywgYW5kIGluIGludGVybmF0aW9uYWwgd2F0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICB5ID0gMC45MTI1LCBzaXplID0gNSwgZm9udGZhY2UgPSAiaXRhbGljIikKCmd6X2NvbWJpbmUoZywgZ1RpdGxlLCBnU3VidGl0bGUsIGdCYW5uZXIsCiAgICAgICAgICAgdG9wID0gYygwLjksIDEsIDEsIDAuMDUpLCAKICAgICAgICAgICBib3R0b20gPSBjKDAuMDEyNSwgMCwgMCwgMCkpCmBgYAoKIyMgLiBOdW1iZXIgb2YgZmF0YWxpdGllcyBwZXIgbW9udGggc2luY2UgMTk4MgoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTQuNX0KZyA8LSBieWRheV9kYXQgJT4lCiAgZ3JvdXBfYnkoTW9udGhfZW5kID0gY2VpbGluZ19kYXRlKGBFdmVudCBEYXRlYCwgdW5pdCA9ICJtb250aHMiKSkgJT4lCiAgc3VtbWFyaXplKGBUb3RhbCBGYXRhbCBJbmp1cmllc2AgPSBzdW0oYFRvdGFsIEZhdGFsIEluanVyaWVzYCkpICU+JQogIGdncGxvdChhZXMoeCA9IE1vbnRoX2VuZCwgeSA9IGBUb3RhbCBGYXRhbCBJbmp1cmllc2ApKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fbGluZShzdGF0ID0gInNtb290aCIsIG1ldGhvZCA9IGxvZXNzLCBzZSA9IEZBTFNFLCBzaXplID0gMiwgY29sb3IgPSAiI0RCNEEzNiIsIGFscGhhID0gMC43NSkgKwogIHlsaW0oMCwgTkEpICsKICB4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArIAogIHRoZW1lX2dyYXBoem9vKGJhc2Vfc2l6ZSA9IDIwKQoKZ0Jhbm5lciA8LSBnel9iYW5uZXIobC50eHQgPSAiR1JBUEhaT08uVFVNQkxSLkNPTSIsIAogICAgICAgICAgICAgICAgICAgICByLnR4dCA9ICJEQVRBOiBOVFNCIiwKICAgICAgICAgICAgICAgICAgICAgZm9udC5zaXplID0gNCkKZ1RpdGxlIDwtIGd6X3RpdGxlKCJVUyBjaXZpbCBhdmlhdGlvbiBmYXRhbGl0aWVzLCAxOTgyLTIwMTciLCBzaXplID0gOCkKZ1N1YnRpdGxlIDwtIGd6X3RpdGxlKCJwZXIgbW9udGgsIHdpdGhpbiB0aGUgVVNBLCBpdHMgdGVycml0b3JpZXMgYW5kIHBvc3Nlc3Npb25zLCBhbmQgaW4gaW50ZXJuYXRpb25hbCB3YXRlcnMiLCAKICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLjkxMjUsIHNpemUgPSA1LCBmb250ZmFjZSA9ICJpdGFsaWMiKQoKZ3pfY29tYmluZShnLCBnVGl0bGUsIGdTdWJ0aXRsZSwgZ0Jhbm5lciwKICAgICAgICAgICB0b3AgPSBjKDAuOSwgMSwgMSwgMC4wNSksIAogICAgICAgICAgIGJvdHRvbSA9IGMoMC4wMTI1LCAwLCAwLCAwKSkKYGBgCgojIyAuIE51bWJlciBvZiBpbmp1cmllcyBwZXIgbW9udGggc2luY2UgMTk4MgoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTQuNX0KZyA8LSBieWRheV9kYXQgJT4lCiAgZ3JvdXBfYnkoTW9udGhfZW5kID0gY2VpbGluZ19kYXRlKGBFdmVudCBEYXRlYCwgdW5pdCA9ICJtb250aHMiKSkgJT4lCiAgc3VtbWFyaXplKEluanVyaWVzID0gc3VtKGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCkgKyBzdW0oYFRvdGFsIE1pbm9yIEluanVyaWVzYCkpICU+JQogIGdncGxvdChhZXMoeCA9IE1vbnRoX2VuZCwgeSA9IEluanVyaWVzKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX2xpbmUoc3RhdCA9ICJzbW9vdGgiLCBtZXRob2QgPSBsb2Vzcywgc2UgPSBGQUxTRSwgc2l6ZSA9IDIsIGNvbG9yID0gIiNEQjRBMzYiLCBhbHBoYSA9IDAuNzUpICsKICB5bGltKDAsIE5BKSArCiAgeGxhYihOVUxMKSArIHlsYWIoTlVMTCkgKyAKICB0aGVtZV9ncmFwaHpvbyhiYXNlX3NpemUgPSAyMCkKCmdCYW5uZXIgPC0gZ3pfYmFubmVyKGwudHh0ID0gIkdSQVBIWk9PLlRVTUJMUi5DT00iLCAKICAgICAgICAgICAgICAgICAgICAgci50eHQgPSAiREFUQTogTlRTQiIsCiAgICAgICAgICAgICAgICAgICAgIGZvbnQuc2l6ZSA9IDQpCmdUaXRsZSA8LSBnel90aXRsZSgiVVMgY2l2aWwgYXZpYXRpb24gbm9uLWxldGhhbCBpbmp1cmllcywgMTk4Mi0yMDE3Iiwgc2l6ZSA9IDgpCmdTdWJ0aXRsZSA8LSBnel90aXRsZSgicGVyIG1vbnRoLCB3aXRoaW4gdGhlIFVTQSwgaXRzIHRlcnJpdG9yaWVzIGFuZCBwb3NzZXNzaW9ucywgYW5kIGluIGludGVybmF0aW9uYWwgd2F0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICB5ID0gMC45MTI1LCBzaXplID0gNSwgZm9udGZhY2UgPSAiaXRhbGljIikKCmd6X2NvbWJpbmUoZywgZ1RpdGxlLCBnU3VidGl0bGUsIGdCYW5uZXIsCiAgICAgICAgICAgdG9wID0gYygwLjksIDEsIDEsIDAuMDUpLCAKICAgICAgICAgICBib3R0b20gPSBjKDAuMDEyNSwgMCwgMCwgMCkpCmBgYAoKIyMgLiBNb250aCB3aXRoIG1vc3QgYWNjaWRlbnRzCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NC41fQpnIDwtIGJ5ZGF5X2RhdCAlPiUKICBncm91cF9ieShNb250aCkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKEV2ZW50cykpICU+JQogIGdncGxvdChhZXMoeCA9IE1vbnRoLCB5ID0gdG90YWwsIGdyb3VwID0gMSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3IgPSAiI0RCNEEzNiIsIGZpbGwgPSAiI0RCNEEzNiIsIGFscGhhID0gMC43NSkgKwogIHlsaW0oMCwgTkEpICsKICB4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArIAogIHRoZW1lX2dyYXBoem9vKGJhc2Vfc2l6ZSA9IDIwKQoKZ0Jhbm5lciA8LSBnel9iYW5uZXIobC50eHQgPSAiR1JBUEhaT08uVFVNQkxSLkNPTSIsIAogICAgICAgICAgICAgICAgICAgICByLnR4dCA9ICJEQVRBOiBOVFNCIiwKICAgICAgICAgICAgICAgICAgICAgZm9udC5zaXplID0gNCkKZ1RpdGxlIDwtIGd6X3RpdGxlKCJVUyBjaXZpbCBhdmlhdGlvbiBhY2NpZGVudHMsIDE5ODItMjAxNyIsIHNpemUgPSA4KQpnU3VidGl0bGUgPC0gZ3pfdGl0bGUoInRvdGFsIGJ5IG1vbnRoLCB3aXRoaW4gdGhlIFVTQSwgaXRzIHRlcnJpdG9yaWVzIGFuZCBwb3NzZXNzaW9ucywgYW5kIGluIGludGVybmF0aW9uYWwgd2F0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICB5ID0gMC45MTI1LCBzaXplID0gNSwgZm9udGZhY2UgPSAiaXRhbGljIikKCmd6X2NvbWJpbmUoZywgZ1RpdGxlLCBnU3VidGl0bGUsIGdCYW5uZXIsCiAgICAgICAgICAgdG9wID0gYygwLjksIDEsIDEsIDAuMDUpLCAKICAgICAgICAgICBib3R0b20gPSBjKDAuMDEyNSwgMCwgMCwgMCkpCmBgYAoKIyMgLiBEYXlzIHdpdGggbW9zdCBhY2NpZGVudHMKCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00LjV9CmcgPC0gYnlkYXlfZGF0ICU+JQogIGdyb3VwX2J5KERheSkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKEV2ZW50cykpICU+JQogIGdncGxvdChhZXMoeCA9IERheSwgeSA9IHRvdGFsLCBncm91cCA9IDEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gIiNEQjRBMzYiLCBmaWxsID0gIiNEQjRBMzYiLCBhbHBoYSA9IDAuNzUpICsKICB5bGltKDAsIE5BKSArCiAgeGxhYihOVUxMKSArIHlsYWIoTlVMTCkgKyAKICB0aGVtZV9ncmFwaHpvbyhiYXNlX3NpemUgPSAyMCkKCmdCYW5uZXIgPC0gZ3pfYmFubmVyKGwudHh0ID0gIkdSQVBIWk9PLlRVTUJMUi5DT00iLCAKICAgICAgICAgICAgICAgICAgICAgci50eHQgPSAiREFUQTogTlRTQiIsCiAgICAgICAgICAgICAgICAgICAgIGZvbnQuc2l6ZSA9IDQpCmdUaXRsZSA8LSBnel90aXRsZSgiVVMgY2l2aWwgYXZpYXRpb24gYWNjaWRlbnRzLCAxOTgyLTIwMTciLCBzaXplID0gOCkKZ1N1YnRpdGxlIDwtIGd6X3RpdGxlKCJ0b3RhbCBieSBkYXksIHdpdGhpbiB0aGUgVVNBLCBpdHMgdGVycml0b3JpZXMgYW5kIHBvc3Nlc3Npb25zLCBhbmQgaW4gaW50ZXJuYXRpb25hbCB3YXRlcnMiLCAKICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLjkxMjUsIHNpemUgPSA1LCBmb250ZmFjZSA9ICJpdGFsaWMiKQoKZ3pfY29tYmluZShnLCBnVGl0bGUsIGdTdWJ0aXRsZSwgZ0Jhbm5lciwKICAgICAgICAgICB0b3AgPSBjKDAuOSwgMSwgMSwgMC4wNSksIAogICAgICAgICAgIGJvdHRvbSA9IGMoMC4wMTI1LCAwLCAwLCAwKSkKYGBgCgojIyAuIE1vbnRoIHdpdGggbW9zdCBmYXRhbGl0aWVzCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NC41fQpnIDwtIGJ5ZGF5X2RhdCAlPiUKICBncm91cF9ieShNb250aCkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGBUb3RhbCBGYXRhbCBJbmp1cmllc2ApKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBNb250aCwgeSA9IHRvdGFsLCBncm91cCA9IDEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gIiNEQjRBMzYiLCBmaWxsID0gIiNEQjRBMzYiLCBhbHBoYSA9IDAuNzUpICsKICB5bGltKDAsIE5BKSArCiAgeGxhYihOVUxMKSArIHlsYWIoTlVMTCkgKyAKICB0aGVtZV9ncmFwaHpvbyhiYXNlX3NpemUgPSAyMCkKCmdCYW5uZXIgPC0gZ3pfYmFubmVyKGwudHh0ID0gIkdSQVBIWk9PLlRVTUJMUi5DT00iLCAKICAgICAgICAgICAgICAgICAgICAgci50eHQgPSAiREFUQTogTlRTQiIsCiAgICAgICAgICAgICAgICAgICAgIGZvbnQuc2l6ZSA9IDQpCmdUaXRsZSA8LSBnel90aXRsZSgiVVMgY2l2aWwgYXZpYXRpb24gZmF0YWxpdGllcywgMTk4Mi0yMDE3Iiwgc2l6ZSA9IDgpCmdTdWJ0aXRsZSA8LSBnel90aXRsZSgidG90YWwgYnkgbW9udGgsIHdpdGhpbiB0aGUgVVNBLCBpdHMgdGVycml0b3JpZXMgYW5kIHBvc3Nlc3Npb25zLCBhbmQgaW4gaW50ZXJuYXRpb25hbCB3YXRlcnMiLCAKICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLjkxMjUsIHNpemUgPSA1LCBmb250ZmFjZSA9ICJpdGFsaWMiKQoKZ3pfY29tYmluZShnLCBnVGl0bGUsIGdTdWJ0aXRsZSwgZ0Jhbm5lciwKICAgICAgICAgICB0b3AgPSBjKDAuOSwgMSwgMSwgMC4wNSksIAogICAgICAgICAgIGJvdHRvbSA9IGMoMC4wMTI1LCAwLCAwLCAwKSkKYGBgCgojIyAuIERheXMgd2l0aCBtb3N0IGZhdGFsaXRpZXMKCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00LjV9CmcgPC0gYnlkYXlfZGF0ICU+JQogIGdyb3VwX2J5KERheSkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGBUb3RhbCBGYXRhbCBJbmp1cmllc2ApKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBEYXksIHkgPSB0b3RhbCwgZ3JvdXAgPSAxKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICIjREI0QTM2IiwgZmlsbCA9ICIjREI0QTM2IiwgYWxwaGEgPSAwLjc1KSArCiAgeWxpbSgwLCBOQSkgKwogIHhsYWIoTlVMTCkgKyB5bGFiKE5VTEwpICsgCiAgdGhlbWVfZ3JhcGh6b28oYmFzZV9zaXplID0gMjApCgpnQmFubmVyIDwtIGd6X2Jhbm5lcihsLnR4dCA9ICJHUkFQSFpPTy5UVU1CTFIuQ09NIiwgCiAgICAgICAgICAgICAgICAgICAgIHIudHh0ID0gIkRBVEE6IE5UU0IiLAogICAgICAgICAgICAgICAgICAgICBmb250LnNpemUgPSA0KQpnVGl0bGUgPC0gZ3pfdGl0bGUoIlVTIGNpdmlsIGF2aWF0aW9uIGZhdGFsaXRpZXMsIDE5ODItMjAxNyIsIHNpemUgPSA4KQpnU3VidGl0bGUgPC0gZ3pfdGl0bGUoInRvdGFsIGJ5IGRheSwgd2l0aGluIHRoZSBVU0EsIGl0cyB0ZXJyaXRvcmllcyBhbmQgcG9zc2Vzc2lvbnMsIGFuZCBpbiBpbnRlcm5hdGlvbmFsIHdhdGVycyIsIAogICAgICAgICAgICAgICAgICAgICAgeSA9IDAuOTEyNSwgc2l6ZSA9IDUsIGZvbnRmYWNlID0gIml0YWxpYyIpCgpnel9jb21iaW5lKGcsIGdUaXRsZSwgZ1N1YnRpdGxlLCBnQmFubmVyLAogICAgICAgICAgIHRvcCA9IGMoMC45LCAxLCAxLCAwLjA1KSwgCiAgICAgICAgICAgYm90dG9tID0gYygwLjAxMjUsIDAsIDAsIDApKQpgYGAKCiMjIC4gTW9udGggd2l0aCBtb3N0IGluanVyaWVzCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NC41fQpnIDwtIGJ5ZGF5X2RhdCAlPiUKICBncm91cF9ieShNb250aCkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCkgKyBzdW0oYFRvdGFsIE1pbm9yIEluanVyaWVzYCkpICU+JQogIGdncGxvdChhZXMoeCA9IE1vbnRoLCB5ID0gdG90YWwsIGdyb3VwID0gMSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3IgPSAiI0RCNEEzNiIsIGZpbGwgPSAiI0RCNEEzNiIsIGFscGhhID0gMC43NSkgKwogIHlsaW0oMCwgTkEpICsKICB4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArIAogIHRoZW1lX2dyYXBoem9vKGJhc2Vfc2l6ZSA9IDIwKQoKZ0Jhbm5lciA8LSBnel9iYW5uZXIobC50eHQgPSAiR1JBUEhaT08uVFVNQkxSLkNPTSIsIAogICAgICAgICAgICAgICAgICAgICByLnR4dCA9ICJEQVRBOiBOVFNCIiwKICAgICAgICAgICAgICAgICAgICAgZm9udC5zaXplID0gNCkKZ1RpdGxlIDwtIGd6X3RpdGxlKCJVUyBjaXZpbCBhdmlhdGlvbiBub24tbGV0aGFsIGluanVyaWVzLCAxOTgyLTIwMTciLCBzaXplID0gOCkKZ1N1YnRpdGxlIDwtIGd6X3RpdGxlKCJ0b3RhbCBieSBtb250aCwgd2l0aGluIHRoZSBVU0EsIGl0cyB0ZXJyaXRvcmllcyBhbmQgcG9zc2Vzc2lvbnMsIGFuZCBpbiBpbnRlcm5hdGlvbmFsIHdhdGVycyIsIAogICAgICAgICAgICAgICAgICAgICAgeSA9IDAuOTEyNSwgc2l6ZSA9IDUsIGZvbnRmYWNlID0gIml0YWxpYyIpCgpnel9jb21iaW5lKGcsIGdUaXRsZSwgZ1N1YnRpdGxlLCBnQmFubmVyLAogICAgICAgICAgIHRvcCA9IGMoMC45LCAxLCAxLCAwLjA1KSwgCiAgICAgICAgICAgYm90dG9tID0gYygwLjAxMjUsIDAsIDAsIDApKQpgYGAKCiMjIC4gRGF5cyB3aXRoIG1vc3QgaW5qdXJpZXMKCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00LjV9CmcgPC0gYnlkYXlfZGF0ICU+JQogIGdyb3VwX2J5KERheSkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCkgKyBzdW0oYFRvdGFsIE1pbm9yIEluanVyaWVzYCkpICU+JQogIGdncGxvdChhZXMoeCA9IERheSwgeSA9IHRvdGFsLCBncm91cCA9IDEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gIiNEQjRBMzYiLCBmaWxsID0gIiNEQjRBMzYiLCBhbHBoYSA9IDAuNzUpICsKICB5bGltKDAsIE5BKSArCiAgeGxhYihOVUxMKSArIHlsYWIoTlVMTCkgKyAKICB0aGVtZV9ncmFwaHpvbyhiYXNlX3NpemUgPSAyMCkKCmdCYW5uZXIgPC0gZ3pfYmFubmVyKGwudHh0ID0gIkdSQVBIWk9PLlRVTUJMUi5DT00iLCAKICAgICAgICAgICAgICAgICAgICAgci50eHQgPSAiREFUQTogTlRTQiIsCiAgICAgICAgICAgICAgICAgICAgIGZvbnQuc2l6ZSA9IDQpCmdUaXRsZSA8LSBnel90aXRsZSgiVVMgY2l2aWwgYXZpYXRpb24gbm9uLWxldGhhbCBpbmp1cmllcywgMTk4Mi0yMDE3Iiwgc2l6ZSA9IDgpCmdTdWJ0aXRsZSA8LSBnel90aXRsZSgidG90YWwgYnkgZGF5LCB3aXRoaW4gdGhlIFVTQSwgaXRzIHRlcnJpdG9yaWVzIGFuZCBwb3NzZXNzaW9ucywgYW5kIGluIGludGVybmF0aW9uYWwgd2F0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICB5ID0gMC45MTI1LCBzaXplID0gNSwgZm9udGZhY2UgPSAiaXRhbGljIikKCmd6X2NvbWJpbmUoZywgZ1RpdGxlLCBnU3VidGl0bGUsIGdCYW5uZXIsCiAgICAgICAgICAgdG9wID0gYygwLjksIDEsIDEsIDAuMDUpLCAKICAgICAgICAgICBib3R0b20gPSBjKDAuMDEyNSwgMCwgMCwgMCkpCmBgYAoKIyAuIFNwYWNlCgojIyAuIFByZXBhcmluZyBkYXRhCgpgYGB7cn0KbG9jX2RhdCA8LSByYXdfZGF0ICU+JQogIGZpbHRlcih5ZWFyKGBFdmVudCBEYXRlYCkgPj0gMjAwMiwgeWVhcihgRXZlbnQgRGF0ZWApIDwgMjAxOCwKICAgICAgICAgIWlzLm5hKExhdGl0dWRlKSwgIWlzLm5hKExvbmdpdHVkZSkpICU+JQogIG11dGF0ZShEYXRlX3JvdW5kID0gY2VpbGluZ19kYXRlKGBFdmVudCBEYXRlYCwgdW5pdCA9ICIzIGRheXMiKSwKICAgICAgICAgTG9uZ2l0dWRlID0gaWZlbHNlKExvbmdpdHVkZSA+IDAsIC1Mb25naXR1ZGUsIExvbmdpdHVkZSkpCmxvY19kYXQKCnhsaW0gPC0gYygtMTgwLCAtMjApCnlsaW0gPC0gYygxMCwgNzIpCndvcmxkX2RhdCA8LSBtYXBfZGF0YSgid29ybGQiKSAlPiUKICByZW5hbWUoWCA9IGxvbmcsIFkgPSBsYXQsIFBJRCA9IGdyb3VwLCBQT1MgPSBvcmRlcikgJT4lCiAgY2xpcFBvbHlzKHhsaW0gPSB4bGltLCB5bGltID0geWxpbSwga2VlcEV4dHJhID0gVFJVRSkgJT4lCiAgYXNfdGliYmxlKCkKd29ybGRfZGF0CmBgYAoKIyMgLiBBbmltYXRlZCBtYXAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00LjV9CmlmICghZmlsZS5leGlzdHMoImFuaW1hdGlvbi5tcDQiKSkgewogIGdCYWNrZ3JvdW5kIDwtIGd6X2JhY2tncm91bmQoKQogIGdCYW5uZXIgPC0gZ3pfYmFubmVyKGwudHh0ID0gIkdSQVBIWk9PLlRVTUJMUi5DT00iLCAKICAgICAgICAgICAgICAgICAgICAgICByLnR4dCA9ICJEQVRBOiBOVFNCIiwKICAgICAgICAgICAgICAgICAgICAgICBmb250LnNpemUgPSA0KQogIGdUaXRsZSA8LSBnel90aXRsZSgiTG9jYXRpb25zIG9mIFVTIGNpdmlsIGF2aWF0aW9uIGFjY2lkZW50cywgMjAwMi0yMDE3Iiwgc2l6ZSA9IDgpCiAgZ1N1YnRpdGxlIDwtIGd6X3RpdGxlKCJ3aXRoaW4gdGhlIFVTQSwgaXRzIHRlcnJpdG9yaWVzIGFuZCBwb3NzZXNzaW9ucywgYW5kIGluIGludGVybmF0aW9uYWwgd2F0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLjkxMjUsIHNpemUgPSA1LCBmb250ZmFjZSA9ICJpdGFsaWMiKQogIAogIHNhdmVWaWRlbyh7CiAgICBkYXRlcyA8LSBzZXEuRGF0ZSh5bWQoIjIwMDItMDEtMDEiKSwgeW1kKCIyMDE3LTEyLTMxIiksIGJ5ID0gMykKICAgIGZvciAoaSBpbiBzZXEoMTpsZW5ndGgoZGF0ZXMpKSkgewogICAgICBnIDwtIGdncGxvdCgpICsKICAgICAgICBnZW9tX3BvbHlnb24oZGF0YSA9IHdvcmxkX2RhdCwgYWVzKHggPSBYLCB5ID0gWSwgZ3JvdXAgPSBQSUQpLAogICAgICAgICAgICAgICAgICAgICBmaWxsID0gImdyYXk1MCIsIGNvbG9yID0gIndoaXRlIikgKwogICAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihsb2NfZGF0LCBEYXRlX3JvdW5kIDw9IGRhdGVzW2ldLCBEYXRlX3JvdW5kID49IChkYXRlc1tpXSAtIDYwKSksIAogICAgICAgICAgICAgICAgICAgYWVzKHggPSBMb25naXR1ZGUsIHkgPSBMYXRpdHVkZSwgYWxwaGEgPSA2MCAtIGFzLm51bWVyaWMoZGF0ZXNbaV0gLSBEYXRlX3JvdW5kKSksIAogICAgICAgICAgICAgICAgICAgcGNoID0gMjEsIGZpbGwgPSAiI0RCNEEzNiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMpICsKICAgICAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMTgwLCB5ID0gMTEsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLAogICAgICAgICAgICAgICAgIGxhYmVsID0gZm9ybWF0KGRhdGVzW2ldLCBmb3JtYXQgPSAiJWIgJVkiKSkgKwogICAgICAgIGNvb3JkX21hcCh4bGltID0geGxpbSwgeWxpbSA9IHlsaW0pICsKICAgICAgICB4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArIGd1aWRlcyhhbHBoYSA9IEZBTFNFKSArIAogICAgICAgIHRoZW1lX2dyYXBoem9vKGJhc2Vfc2l6ZSA9IDE4KSArCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiAgICAgIAogICAgICBnel9jb21iaW5lKGdCYWNrZ3JvdW5kLCBnLCBnVGl0bGUsIGdTdWJ0aXRsZSwgZ0Jhbm5lciwKICAgICAgICAgICAgICAgICB0b3AgPSBjKDEsIDAuOSwgMSwgMSwgMC4wNSksCiAgICAgICAgICAgICAgICAgYm90dG9tID0gYygwLjA1LCAwLjAxMjUsIDAuMDUsIDAuMDUsIDApKQogICAgfQogIH0sIGFuaS5oZWlnaHQgPSA0ODAsIGFuaS53aWR0aCA9IDcyMCwgaW50ZXJ2YWwgPSAxIC8gMzApCn0KYGBgCgohW0FuaW1hdGlvbl0oYW5pbWF0aW9uLm1wNCkKCgoK